#include "CBuff.h"


//////////////////////////////////////////////////////////////////
//  CBuff
//////////////////////////////////////////////////////////////////

CBuff::CBuff(IN UINT size)
{
    m_pBuff = new char[size];
    m_nEndPos = 0;
    m_nSize = size;
}

CBuff::~CBuff()
{
    if (m_pBuff)
    {
        delete[] m_pBuff;
        m_pBuff = nullptr;
    }
}

BOOL CBuff::Append(IN const char* data, IN const UINT length)
{
    BOOL bRet = FALSE;

    if (m_nSize - m_nEndPos >= length)
    {
        memcpy(m_pBuff + m_nEndPos, data, length);
        m_nEndPos += length;
        bRet = TRUE;
    }

    return bRet;
}


//////////////////////////////////////////////////////////////////
//  CSendBuff
//////////////////////////////////////////////////////////////////

CSendBuff::CSendBuff(IN UINT size) : CBuff(size)
{
}

CSendBuff::~CSendBuff()
{
}

int CSendBuff::Send(IN SOCKET socket)
{
    if (!GetEndPos()) return 0;

    int nRetLen = send(socket, GetBuff(), GetEndPos(), 0);
    ResetEndPos();
    return nRetLen;
}


//////////////////////////////////////////////////////////////////
//  CRecvBuff
//////////////////////////////////////////////////////////////////

CRecvBuff::CRecvBuff(IN UINT size) : CBuff(size)
{
}

CRecvBuff::~CRecvBuff()
{
}

int CRecvBuff::Recv(IN SOCKET socket)
{
    int nLen = 0;

    nLen = recv(socket, GetBuff() + GetEndPos(), GetBuffSize() - GetEndPos(), 0);
    if (nLen > 0)
        AdvanceEndPos(nLen);

    return nLen;
}
